import axios from 'axios'
import {ElMessage} from "element-plus";


const request = axios.create({
    baseURL: '/api',  // 注意！！ 这里是全局统一加上了 '/api' 前缀，也就是说所有接口都会加上'/api'前缀，在页面里面写接口的时候就不要加 '/api'了，否则会出现2个'/api'，类似 '/api/api/user'这样的报错，切记！！！
    timeout: 50000,
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token，对请求参数统一加密
// interceptors 译为拦截器
request.interceptors.request.use(
    config => {
        config.headers['Content-Type'] = 'application/json;charset=utf-8';
        // 从localStorage获取token和过期时间戳
        const token = localStorage.getItem('token');
        const expires = localStorage.getItem('token_expires');
        const expiresInt = parseInt(expires, 10);
        const now = new Date().getTime();
        if (token && expiresInt && now < expiresInt - 10) {
            // 如果token没有过期，附加token到请求头
            config.headers['Authorization'] = `${token}`;
        } else {
            // 如果token已经过期，移除localStorage中的token
            localStorage.removeItem('token');
            localStorage.removeItem('token_expires');
        }
        return config;
    },
    error => {
        return Promise.reject(error);
    }
);

// response 拦截器（interceptors）
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        // 尝试从响应头中获取token
        const token = response.headers.get('Authorization');
        const expiredTime = response.headers.get('Token-Expired-Time');
        const expiredTimeInt = parseInt(expiredTime, 10);
        if (token) { //有该响应项：则为登陆
            // 如果找到token，则将其存储在localStorage中
            localStorage.setItem('token', token);

            const now = new Date().getTime(); // 当前时间戳
            const expires = now + expiredTimeInt * 60 * 60 * 1000; // 后端设置5小时后的时间戳
            localStorage.setItem('token_expires', expires.toString()); //设置token过期时间
        }


        let res = response.data;  // 拿数据的时候就少写一个data
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res  // 确保将字符串 res 解析成一个 JSON 对象
        }
        return res;
    },
    error => {
        if (axios.isCancel(error)) {
            // 请求被取消，不处理
            return Promise.reject(error);
        }
        if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
            // 请求超时，弹出提示框
            ElMessage.error('请求超时，请稍后重试');
        }
        return Promise.reject(error);
    }
)


// 封装 GET 请求
function get(url, params, config = {}) {
    return new Promise((resolve, reject) => {
        request({...config, method: 'get', url, params})
            .then(response => {
                resolve(response);
            })
            .catch(error => {
                reject(error);
            });
    });
}

// 封装 POST 请求
function post(url, data, config = {}) {
    return new Promise((resolve, reject) => {
        request({...config, method: 'post', url, data})
            .then(response => {
                resolve(response);
            })
            .catch(error => {
                reject(error);
            });
    });
}


// 封装 DELETE 请求
function deleteRequest(url, config = {}) {
    return new Promise((resolve, reject) => {
        request({...config, method: 'delete', url})
            .then(response => {
                resolve(response);
            })
            .catch(error => {
                reject(error);
            });
    });
}

// 封装 PUT 请求
function put(url, data, config = {}) {
    return new Promise((resolve, reject) => {
        request({...config, method: 'put', url, data})
            .then(response => {
                resolve(response);
            })
            .catch(error => {
                reject(error);
            });
    });
}

// 封装获取文件请求
function getFile(url, params, config = {}) {
    return new Promise((resolve, reject) => {
        request({
            ...config,
            method: 'get',
            url,
            params,
            responseType: 'blob' // 指示服务器返回的是文件数据
        })
            .then(response => {
                // 处理文件数据
                resolve(response);
            })
            .catch(error => {
                reject(error);
            });
    });
}



// 将封装的方法添加到request对象，方便调用
request.get = get;
request.post = post;
request.delete = deleteRequest;
request.put = put;
request.getFile = getFile;



export default request;


// // 在其他文件中导入封装后的 request,比如登录页面
// import request from "../utils/request.js";
//
// // 使用 GET 请求
// request.get('/user', { params: { userId: 123 } })
//     .then(response => {
//         console.log(response);
//     })
//     .catch(error => {
//         console.error(error);
//     });
//
// // 使用 POST 请求
// request.post('/user', { name: 'LeiDeYou' })
//     .then(response => {
//         console.log(response);
//     })
//     .catch(error => {
//         console.error(error);
//     });